<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2020/5/22} {16:43} 
 */

namespace libraries;


use app\websitext\hooks\BaseCenterHook;
use think\cache\driver\Redis as RedisDriver;
use think\Db;
use think\facade\Cache;

class RedisUtility
{
    protected static $redisHandle = null;

    /**
     * desc：初始化Redis对象
     * author：wh
     * @return object|null
     */
    static function redisObject(){
        if(empty(self::$redisHandle)){
            //初始化驱动拿到句柄
            self::$redisHandle = (new RedisDriver(config('cache.redis')))->handler();
        }
        return self::$redisHandle;
    }
    /**
     * desc：设置 0 永久有效
     * author：wh
     * @param $key_name 键名
     * @param $value 值 json数据
     * @return bool
     */
    static function set($key_name, $value){
        return Cache::store('redis')->set($key_name, json_encode($value, JSON_UNESCAPED_UNICODE));
    }

    /**
     * desc：重置
     * author：wh
     * @param $key_name
     * @return bool
     */
    static function reset($key_name){
        return Cache::store('redis')->set($key_name, null);
    }

    /**
     * desc：设置过期时间
     * author：wh
     * @param $key_name 键名
     * @param $value 值 json数据
     * @param int $expire 过期时间 0 永久有效
     * @return bool
     */
    static function setExpire($key_name, $value, $expire=0){
        return Cache::store('redis')->set($key_name, json_encode($value), $expire);
    }

    /**
     * desc：存储hash类型
     * author：wh
     * @param $key
     * @param $field
     * @param $value
     */
    static function hSet($key, $field, $value){
        return self::redisObject()->hSet($key, $field, json_encode($value, JSON_UNESCAPED_UNICODE));
    }

    /**
     * desc：删除指定的键。
     * author：wh
     * @param $key
     * @return mixed
     */
    static function delete($key){
        return self::redisObject()->delete($key);
    }

    /**
     * desc：从存储在键上的哈希中移除一个值。
     * 如果哈希表不存在，或者键不存在，则返回 FALSE 。
     * author：wh
     * @param $key
     * @param $hashKey1
     * @return mixed
     */
    static function hDel($key, $hashKey1){
        return self::redisObject()->hDel($key, $hashKey1);
    }
    /**
     * desc：读取数据，写入Redis[过滤忽略表和特征表]
     * 注意：数据量大时可能会造成服务器内存超过限制异常
     * 默认table+id规则
     * author：wh
     * @param array $tables 表集合：['table1','table2','table3']
     * @param array $table_feature 忽略特征 ['log_','web_','xxx_']
     * @param array $ignore_tables 忽略表 ['table1','table2','table3']
     * @param string $write_method 写入方式：hash存储、string存储
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    static function write(array $tables, array $table_feature=[], array $ignore_tables=[], $write_method='', $pk='id'){
        if(empty($tables)) return false;

        $baseCenterHookObj = new BaseCenterHook();

        foreach ($tables as $key=>$table){
            $is_pass = false;//忽略开关 true 忽略；false 不忽略
            //忽略特征
            foreach ($table_feature as $feature){
                if(false !== strpos($table, $feature)) {
                    //找到忽略特征
                    $is_pass = true;
                    break;//中断循环
                }
            }
            //过滤含有忽略特征
            if($is_pass) continue;

            //过滤忽略表
            if(in_array($table, $ignore_tables)){
                continue;
            }

            //获取有效状态数据
            $items = $baseCenterHookObj->getValidStatusDatas($table);

            if(empty($items)) continue;
            //string 写入
            if(strtolower($write_method) == 'string'){
                foreach ($items as $item){
                    Cache::store('redis')->set($table.'_'.$item[$pk], $item);
                }
            }
            //hash 写入
            if(strtolower($write_method) == 'hash'){
                foreach ($items as $item){
                    //只有选择了hash方式才会创建Redis对象
                    RedisUtility::hSet($table, $table.'_'.$item[$pk], $item);
                }
            }

        }
        return true;
    }

}